# LeetCode 7、整数反转
# 一、题目描述
给你一个 32 位的有符号整数 x
,返回将 x
中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1]
,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-2^31 <= x <= 2^31 - 1
# 二、题目解析
# 三、参考代码
# 1、Java 代码
// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
// 作者:程序员吴师兄
// 微信:wzb_3377
// 代码有看不懂的地方一定要私聊咨询吴师兄呀
// 整数反转(LeetCode 7):https://leetcode.cn/problems/reverse-integer/
class Solution {
public int reverse(int x) {
// 记录反转成功之后的结果
int res = 0;
// 对于需要反转的数字 x
// 每一次都按照【从后向前】的顺序去访问每个元素
// 在访问过程中会执行一些逻辑判断
// 判断过程中可能会由于越界直接返回 0
// 否则会一直判断下去,直到 x 的每个元素均被访问,即 x = 0 时跳出循环
while( x != 0 ) {
// 每一次都先获取末尾数字
int lastNum = x % 10;
// 假设有 1147483649 这个数字,它是小于最大的 32 位整数 2147483647 的
// 但是将这个数字反转过来后就变成了 9463847411 ,超过了最大的 32 位整数
// 根据题目要求需要返回 0
// 在获取到 lastNum 的过程中,需要判断一下当前的 res 是否合法
// 如果不合法,就不用再添加 lastNum,结果直接返回 0 就行
// 1、res 为正数并且大于了 214748364 ,即最小为 214748365 ,那么无论 lastNum 为多少,添加上去都会不合法
// 比如 lastNum 最小为 0 ,形成了 2147483650 ,也是大于 2147483647
// 2、res 等于了 214748364 ,那么在它的后面添加 8、9,就会形成 2147483648 、2147483649 这两个数
// 而这两个数都不合法,返回 0
if (res > 214748364 || ( res == 214748364 && (lastNum == 8 || lastNum == 9 ))) {
// 返回 0
return 0;
}
// 3、res 为负数并且小于了 -214748364 ,即最大为 214748365 ,那么无论 lastNum 为多少,添加上去都会不合法
// 比如 lastNum 最小为 9 ,形成了 -2147483650 ,也是小于 -2147483648
// 4、res 等于了 -214748364 ,那么在它的后面添加 9,就会形成 -2147483649 这个数
// 而这个数不合法,返回 0
if (res < -214748364 || (res == -214748364 && lastNum == -9 )) {
// 返回 0
return 0;
}
// 5、否则说明可以继续添加
// res 全部元素向左移动,即 10
res = res 10 + lastNum;
// 6、在去获取 x 的下一个数
x /= 10;
}
// 返回结果
return res;
}
}
# 2、C++ 代码
class Solution {
public:
int reverse(int x) {
// 记录反转成功之后的结果
int res = 0;
// 对于需要反转的数字 x
// 每一次都按照【从后向前】的顺序去访问每个元素
// 在访问过程中会执行一些逻辑判断
// 判断过程中可能会由于越界直接返回 0
// 否则会一直判断下去,直到 x 的每个元素均被访问,即 x = 0 时跳出循环
while( x != 0 ) {
// 每一次都先获取末尾数字
int lastNum = x % 10;
// 假设有 1147483649 这个数字,它是小于最大的 32 位整数 2147483647 的
// 但是将这个数字反转过来后就变成了 9463847411 ,超过了最大的 32 位整数
// 根据题目要求需要返回 0
// 在获取到 lastNum 的过程中,需要判断一下当前的 res 是否合法
// 如果不合法,就不用再添加 lastNum,结果直接返回 0 就行
// 1、res 为正数并且大于了 214748364 ,即最小为 214748365 ,那么无论 lastNum 为多少,添加上去都会不合法
// 比如 lastNum 最小为 0 ,形成了 2147483650 ,也是大于 2147483647
// 2、res 等于了 214748364 ,那么在它的后面添加 8、9,就会形成 2147483648 、2147483649 这两个数
// 而这两个数都不合法,返回 0
if (res > 214748364 || ( res == 214748364 && (lastNum == 8 || lastNum == 9 ))) {
// 返回 0
return 0;
}
// 3、res 为负数并且小于了 -214748364 ,即最大为 214748365 ,那么无论 lastNum 为多少,添加上去都会不合法
// 比如 lastNum 最小为 9 ,形成了 -2147483650 ,也是小于 -2147483648
// 4、res 等于了 -214748364 ,那么在它的后面添加 9,就会形成 -2147483649 这个数
// 而这个数不合法,返回 0
if (res < -214748364 || (res == -214748364 && lastNum == -9 )) {
// 返回 0
return 0;
}
// 5、否则说明可以继续添加
// res 全部元素向左移动,即 10
res = res 10 + lastNum;
// 6、在去获取 x 的下一个数
x /= 10;
}
// 返回结果
return res;
}
};
# 3、Python 代码
class Solution:
def reverse(self, x: int) -> int:
# 记录反转成功之后的结果
res = 0
# 对于需要反转的数字 x
# 每一次都按照【从后向前】的顺序去访问每个元素
# 在访问过程中会执行一些逻辑判断
# 判断过程中可能会由于越界直接返回 0
# 否则会一直判断下去,直到 x 的每个元素均被访问,即 x = 0 时跳出循环
while x != 0 :
# 每一次都先获取末尾数字
lastNum = x % 10
# Python3 的取模运算在 x 为负数时也会返回 [0, 9) 以内的结果,因此这里需要进行特殊判断
if x < 0 and lastNum > 0:
lastNum -= 10
# 假设有 1147483649 这个数字,它是小于最大的 32 位整数 2147483647 的
# 但是将这个数字反转过来后就变成了 9463847411 ,超过了最大的 32 位整数
# 根据题目要求需要返回 0
# 在获取到 lastNum 的过程中,需要判断一下当前的 res 是否合法
# 如果不合法,就不用再添加 lastNum,结果直接返回 0 就行
# 1、res 为正数并且大于了 214748364 ,即最小为 214748365 ,那么无论 lastNum 为多少,添加上去都会不合法
# 比如 lastNum 最小为 0 ,形成了 2147483650 ,也是大于 2147483647
# 2、res 等于了 214748364 ,那么在它的后面添加 8、9,就会形成 2147483648 、2147483649 这两个数
# 而这两个数都不合法,返回 0
if res > 214748364 or ( res == 214748364 and (lastNum == 8 or lastNum == 9 )) :
# 返回 0
return 0
# 3、res 为负数并且小于了 -214748364 ,即最大为 214748365 ,那么无论 lastNum 为多少,添加上去都会不合法
# 比如 lastNum 最小为 9 ,形成了 -2147483650 ,也是小于 -2147483648
# 4、res 等于了 -214748364 ,那么在它的后面添加 9,就会形成 -2147483649 这个数
# 而这个数不合法,返回 0
if res < -214748364 or (res == -214748364 and lastNum == -9 ) :
# 返回 0
return 0
# 5、否则说明可以继续添加
# res 全部元素向左移动,即 10
res = res 10 + lastNum
# 6、在去获取 x 的下一个数
# Python3 的整数除法在 x 为负数时会向下(更小的负数)取整,因此不能写成 x //= 10
x = (x - lastNum) // 10
# 返回结果
return res